package com.example.jsoup.kuang.project;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 返回 提取的数据列表 工具类
 */
public class NeedListUtil {

    // main 函数 测试
    public static void main(String[] args) {

        // 返回 人才需求 1、技术需求 2、服务需求 3，（id 和 url） Map 类型的 List 列表
//        List<Map<String, String>> listJson = NeedListUtil.getNeedListReturnMapList(1, 115);
//        String strJson = JSONObject.toJSON(listJson).toString();
//        System.out.println("\n 列表 id 和 url 数据：：：：\n" + strJson);

        // 返回 项目库 （id 和 url 和 cover) Map 类型的 List 列表
        List<Map<String, String>> listJson = NeedListUtil.getProjectListReturnMapList(1);
        String strJson = JSONObject.toJSON(listJson).toString();
        System.out.println("\n 列表 id 和 url 和 cover 数据：：：：\n" + strJson);

    }

    /**
     * @param demand_type 【---人才需求 demand_type=1---】、【---技术需求 demand_type=2---】、【---服务需求 demand_type=3---】
     * @param pageIndex   【---页码 从 1 开始，需要循环递增 1，来获取下一页的数据---】
     * @return 每一页的需求列表数据 这里 返回 15 条数据  返回 id 和 url 数据 的 map 列表数据
     */
    public static List<Map<String, String>> getNeedListReturnMapList(int demand_type, int pageIndex) {

        // demand_type 只能为 1、2、3，不是其中之一时，返回 null
        if (demand_type == 1 || demand_type == 2 || demand_type == 3) {

//            String addressUrl = "https://www.kczg.org.cn/index/ajaxGetDemand?demand_type=1&industry_id=1&field_id=1&date_type=0&title=0&province_id=0&first_code=0&size_type=2&page=";
            String addressUrl = "https://www.kczg.org.cn/index/ajaxGetDemand?demand_type=" + demand_type + "&industry_id=" + demand_type + "&field_id=" + demand_type + "&date_type=0&title=0&province_id=0&first_code=0&size_type=2&page=";

            List<Map<String, String>> idAndUrlMapList = new ArrayList<>();

            // 创建Httpclient对象
            CloseableHttpClient httpClient = HttpClients.createDefault();

            // 问题库 人才需求、技术需求、服务需求 列表数据请求 url
            HttpPost httpPost = new HttpPost(addressUrl + pageIndex);  // 拼接请求地址和页码

            // 请求头 user-agent
            httpPost.addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.366");

            // 响应
            CloseableHttpResponse response = null;

            try {
                // 使用httpClient发起请求 获取 response
                response = httpClient.execute(httpPost);

                // 解析响应
                if (response.getStatusLine().getStatusCode() == 200) {

                    // 响应返回的json数据，但这里是String字符串类型，所以下面要做转换
                    String content = EntityUtils.toString(response.getEntity(), "utf8");

                    /////////////// 返回的 content json字符串解析 ////////////

                    // 把字符串转换为 json 对象
                    JSONObject jsonObject = JSON.parseObject(content);

                    // 通过已知的 key 键，获取 value 值
                    String data = jsonObject.get("data").toString(); // data 数据列表字符串

                    // 把 data 字符串数据列表 转为 类似 List 类型的数组
                    JSONArray jsonArray = new JSONArray(data);  // 使用这个包的 import org.json.JSONArray;

                    for (int i = 0; i < jsonArray.length(); i++) {
                        Map<String, String> map = new HashMap<>();

                        // 取出需要的值
                        String id = jsonArray.getJSONObject(i).get("id").toString();
                        String url = jsonArray.getJSONObject(i).get("url").toString();

                        // 组装成一个 map
                        map.put("id", id);
                        map.put("url", url);

                        // 添加到 List 中
                        idAndUrlMapList.add(map);
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                try {
                    // 关闭httpClient
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    // 关闭response
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            // 返回结果列表
            return idAndUrlMapList;

        } else {
            // demand_type 不是 1、2、3 其中一个时，返回 null
            return null;
        }
    }


    /**
     * 项目库 列表数据 返回 专属方法
     *
     * @param pageIndex
     * @return
     */
    public static List<Map<String, String>> getProjectListReturnMapList(int pageIndex) {

        String addressUrl = "https://www.kczg.org.cn/index/ajaxGetAchievement?demand_type=0&industry_id=0&field_id=0&date_type=0&title=0&province_id=0&first_code=0&size_type=2&page=";

        List<Map<String, String>> idAndUrlAndCoverMapList = new ArrayList<>();

        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 问题库 人才需求、技术需求、服务需求 列表数据请求 url
        HttpPost httpPost = new HttpPost(addressUrl + pageIndex);  // 拼接请求地址和页码

        // 请求头 user-agent
        httpPost.addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.366");

        // 响应
        CloseableHttpResponse response = null;

        try {
            // 使用httpClient发起请求 获取 response
            response = httpClient.execute(httpPost);

            // 解析响应
            if (response.getStatusLine().getStatusCode() == 200) {

                // 响应返回的json数据，但这里是String字符串类型，所以下面要做转换
                String content = EntityUtils.toString(response.getEntity(), "utf8");

                /////////////// 返回的 content json字符串解析 ////////////

                // 把字符串转换为 json 对象
                JSONObject jsonObject = JSON.parseObject(content);

                // 通过已知的 key 键，获取 value 值
                String data = jsonObject.get("data").toString(); // data 数据列表字符串

                // 把 data 字符串数据列表 转为 类似 List 类型的数组
                JSONArray jsonArray = new JSONArray(data);  // 使用这个包的 import org.json.JSONArray;

                for (int i = 0; i < jsonArray.length(); i++) {
                    Map<String, String> map = new HashMap<>();

                    // 取出需要的值
                    String id = jsonArray.getJSONObject(i).get("id").toString();
                    String url = jsonArray.getJSONObject(i).get("url").toString();
                    String cover = jsonArray.getJSONObject(i).get("cover").toString(); // 列表展示图片
                    String address = jsonArray.getJSONObject(i).get("address").toString(); // 单位名称（地址）

                    // 组装成一个 map
                    map.put("id", id);
                    map.put("url", url);
                    map.put("cover", cover);
                    map.put("address", address);

                    // 添加到 List 中
                    idAndUrlAndCoverMapList.add(map);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            try {
                // 关闭httpClient
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                // 关闭response
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 返回结果列表
        return idAndUrlAndCoverMapList;
    }

}
